package demo1229.pm;

/*
 线程之间的通信
 Object类中的方法
 public final void wait()throws InterruptedException
 调用该方法就会进入无限等待状态,必须是该对象的notify()或者notifyAll()方法唤醒.
 public final void notify();
 唤醒该对象监听器上等待的单个线程.

步骤:
1.创建一个顾客线程(消费者):告知老板要的包子种类和数量,
调用wait()方法,放弃cup的执行,进入等待状态.
2.创建一个老板线程(生产者):花了3秒钟做包子,做好包子后,
调用notify()方法,唤醒顾客吃包子.

注意:
顾客和老板线程必须使用同步技术,保证两个线程只有一个在执行.
同步代码块,锁对象是唯一的.
只有锁对象才可以调用wait和notify方法.
 */
public class Demo_03 {
    public static void main(String[] args) {
//    创建一个锁对象,锁对象唯一
        Object obj = new Object();
//        创建一个顾客线程
        new Thread(){
            @Override
            public void run() {
                while (true){
                    //使用同步代码块
                    synchronized (obj){
                        System.out.println("告知老板买包子的种类和数量:");
                        //进入等待状态
                        try {
                            obj.wait();
                            //顾客线程被唤醒后,执行的代码
                            System.out.println("包子已经做好了,我开始吃了");
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.println("==============");
                    }
                }

            }
        }.start();

//        创建一个老板线程
        new Thread(){
            @Override
            public void run() {
                while (true){
                    try {
//                老板需要花费3秒钟做包子
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (obj){
                        System.out.println("老板3秒钟做好包子,告诉顾客,可以吃包子");
//                    包子做好了,通知顾客线程吃包子
                        obj.notify();
                    }
                }
            }
        }.start();
    }
}
